查看原文
其他

在原生iOS或Android应用中将Unity作为库使用

Unity Unity官方平台 2022-05-07

Unity 2019.3将添加支持,可以将Unity作为原生Android/Java和iOS/Objective C应用控制的库,以便轻松加入AR和其它Unity功能。


在一些情况下,使用Android/Java和iOS/Objective C等原生平台技术的开发者可能希望在应用或游戏中加入Unity提供的功能,通常用于3D或2D实时渲染。

 

从Unity 2019.3.a2开始,我们通过把Unity运行时组件和内容集成到原生平台项目,在原生应用中将Unity作为库使用。Unity Runtime Library公开了控制功能,从而在原生应用中管理加载、激活和卸载的时间和方式。

 

这意味着开发者可以将Unity所能实现的增强现实AR、3D/2D实时渲染、2D迷你游戏等功能,直接添加到自己的原生移动应用。

 

 

请注意:将Unity作为库使用,要求开发者对Android/Java和iOS/Objective C的架构有着深入的了解。


限制

我们测试了很多种将Unity作为库并由原生应用托管的情况,但由于Unity不再控制运行时的生命周期,因此我们无法确保它可以在所有用例都正常工作,例如:

  • 作为库使用的Unity仅支持全屏渲染,不支持在屏幕的一部分进行渲染。

  • 不支持加载多个Unity运行时实例。

  • 开发者需要调整第三方插件,包括原生插件和托管插件,从而让它们正常工作。


项目结构改变

Unity运行时库会公开控制功能,以管理在原生应用中加载,激活和卸载的时间和方式。移动应用的构建过程总体上依旧相同,Unity将创建iOS Xcode和Android Gradle项目。

 

为了启用该功能,我们修改了生成iOS Xcode和Android Gradle项目的结构,结构如下:

  • :iOS框架和Android Archive(AAR)文件,包含所有源文件和插件。

  • 精简的启动器:包含应用程序展示数据,它会运行库部分。

 

我们将在后续文章中,提供关于如何把iOS / Android库部分加入到原生应用程序的分步讲解。下面介绍Xcode项目和Android Gradle项目的变化。


iOS

主要功能围绕Xcode项目展开,以获得名为UnityFramework的额外目标。此目标包括源/插件和依赖框架,并生成UnityFramework.framework文件。启动屏幕,Xib,图标,数据等保留在Unity-iPhone目标中。Unity-iPhone目标将对UnityFramework目标具有单一依赖性。


UnityFramework提供简单的API来管理播放器从本机端加载/卸载,在需要时暂停/取消暂停,向游戏对象发送消息并设置播放器数据文件夹所在的捆绑包,这样就可以在一个地方拥有Unity播放器需要运行的所有框架文件。


改变

将Unity作为库的功能对API和Xcode项目结构带来了一些变化。


对于大多数用例而言,所有内容会和原先一样工作,但如果你开发或使用插件、自定义BuildPostProcessor、PBXProject和CI即使在开发者没有将Unity作为库使用,这些变化也可能会影响项目


1

 PBXProject 

PBXProject.GetUnityTargetName和pbxProject->TargetGuidByName(“Unity-iPhone”)都已经被弃用。


我们改为使用pbxProject->GetUnityFrameworkTargetGuid(),它用于源代码、插件、依赖框架和源代码构建选项,或使用pbxProject->GetUnityMainTargetGuid()。使用已弃用函数会遇到异常。

// 下面代码已被弃用

string targetGuid = proj.TargetGuidByName("Unity-iPhone");

string targetGuid = proj.TargetGuidByName(PBXProject.GetUnityTargetName());

 

// 请改为调用下面二个代码之一

string targetGuid = proj.GetUnityFrameworkTargetGuid();

string targetGuid = proj.GetUnityMainTargetGuid();


如何在资源包或自定义后处理程序中,同时支持旧的和新的代码路径?


  • 在允许情况下使用插件导入器功能,例如:指定额外框架。

  • 使用反射。

string mainTargetGuid;

string unityFrameworkTargetGuid;

      

var unityMainTargetGuidMethod = proj.GetType().GetMethod("GetUnityMainTargetGuid");

var unityFrameworkTargetGuidMethod = proj.GetType().GetMethod("GetUnityFrameworkTargetGuid");

              

if (unityMainTargetGuidMethod != null && unityFrameworkTargetGuidMethod != null)

{

    mainTargetGuid = (string)unityMainTargetGuidMethod.Invoke(proj, null);

    unityFrameworkTargetGuid = (string)unityFrameworkTargetGuidMethod.Invoke(proj, null);

}

else

{

    mainTargetGuid = proj.TargetGuidByName ("Unity-iPhone");

    unityFrameworkTargetGuid = mainTargetGuid;

}


2

ProjectCapabilityManager 

ProjectCapabilityManager现在会接收目标的全局唯一标识符GUID。


3

xcodebuild 

一些构建设置拥有后缀来指定确切目标,这些后缀有:*_APP表示应用目标,*_FRAMEWORK表示框架目标。


在构建xcodebuild时,这样使用加入后缀的版本:

PRODUCT_NAME -> PRODUCT_NAME_APP

PROVISIONING_PROFILE -> PROVISIONING_PROFILE_APP

PROVISIONING_PROFILE_SPECIFIER  -> PROVISIONING_PROFILE_SPECIFIER_APP

OTHER_LDFLAGS -> OTHER_LDFLAGS_FRAMEWORK


示例

将Unity作为库集成到原生iOS应用的示例,请参考:

https://forum.unity.com/threads/integration-unity-as-a-library-in-native-ios-app.685219/


Android

如果使用Unity作为库,Android Gradle项目的结构会发生改变。如果使用自定义mainTemplate.gradle或AndroidManifest.xml,这些改变也会影响项目或Unity插件。


此前,Unity会使用单个Gradle模块来构建Android应用。现在,Unity会使用二个模块创建Gradle项目,即:unityLibrary模块和启动器模块


改变

unityLibrary模块包含Unity运行时和项目数据。该模块是一个可以轻松集成到任何其它Gradle项目中的库,也可以把Unity嵌入到现有原生Android项目中。


启动器模块包含所有图标和应用名称,它是一个简单的Android应用程序,可以启动Unity。


1

Gradle项目结构

将Unity作为库会提供新的Gradle项目结构,它会更好的符合Android Studio项目最佳结构。该结构中有一个根文件夹,其中包含一些可以单独构建和使用的子项目。它让导入Unity Android Studio项目更加简单。



2

Gradle模板工作流程

Gradle模板会描述和配置使用Gradle构建Android应用的方法。每个Gradle模板代表一个Gradle项目,Gradle项目可以包括和依赖其它Gradle项目。

 

将Unity作为库的Gradle模板文件如下:

  • baseProjectTemplate.gradle:包含所有其它模板和Gradle项目共享的配置,即Android Gradle插件上的代码库和依赖。

  • launcherTemplate.gradle:包含如何构建Android应用的指令,例如:打包,签名和APK分离等,具体取决于unityLibrary项目,它会输出一个APK文件或App Bundle。

  • mainTemplate.gradle:包含如何把Unity构建为库的指令,它会输出.aar格式文件,用户可以提供自定义模板来重写Unity模板,包括编辑器设置。

  • libTemplate.gradle:与之前的工作方式相同。


3

清单工作流程

将Unity作为库会改变Unity Android应用清单文件的使用方式。此前会有一个AndroidManifest.xml文件,用于给Android应用提供图标、行为、权限和其它设置。

 

使用新系统后,我们有二个清单文件,而不是一个:

  • LauncherManifest.xml:负责处理图标、应用名称、开始行为及其目的、安装位置、支持的屏幕大小和设置“isGame”。

     

  • LibraryManifest.xml:负责声明Unity行为、权限、Unity行为使用的主题、VR模式、VR性能、使行为不可以调整大小、设置最大高宽比、应对配置改动、朝向、启动模式、Android UI硬件加速、使用的功能,例如游戏手柄或图形API和槽口支持。


    该清单文件可以通过在Plugins/Android文件夹中提供自定义AndroidManifest.xml文件来重写。


示例

将Unity作为库集成到原生Android应用的示例,请参考:

https://forum.unity.com/threads/integration-unity-as-a-library-in-native-android-app.685240/


推动改变营销的技术

作为库的Unity可以为不同行业的各种用例提供巨大优势,品牌和创意公司可以轻松地把AR直接加入原生移动应用。

 

前沿品牌会看到添加AR到传统营销活动的价值,由于Unity支持把Unity用作库,因此添加过程会得到简化。品牌和创意公司不再需要重新构建应用以加入AR功能,或自己开发解决方案来把Unity用作库。

 

消费者已经准备好迎接AR营销,AR让品牌和消费者建立起个人关系,我们很高兴提供推动营销发展的解决方案。

 

了解品牌和创意公司如何使用Unity,请访问Unity解决方案网站:

https://unity.com/solutions/brands-and-creative-agencies


更多Unity最新信息,请关注Unity Connect平台(Connect.unity.com)下载Unity Connect APP,请点击此处。 观看部分Unity官方视频,请关注B站帐户:Unity官方


推荐阅读

Unity性能优化的最佳实践

使用Unity制作《龙珠》龟派气功冲击波

使用Unity实现魔法火焰效果

AR Foundation现已支持ARKit 3

Unity Reflect:一键转换BIM数据至实时3D环境

Unity多人游戏联机功能Netcode的迁移与升级

《CF穿越火线》引擎动画案例分享(上)

实时3D技术改变汽车行业的五大案例



点个“在看”,表达你的态度

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存